package cn.oowoo.common.dto;


import cn.oowoo.common.config.ValidDate;
import lombok.Data;
import lombok.NonNull;
import org.hibernate.validator.constraints.Range;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.*;

/**
 * 使用hibernate validator 验证框架校验参数
 * 1、最好使用包装类型，防止初始化类的时候有默认值影响校验结果
 * 2、@Size @Range @Email  允许为null或者空字符串，如果不为空也不为null的情况才进行校验
 * 3、@Pattern 允许参数为null，如果不为null则会进行校验(如果前端不传递值则不会进行校验)
 *
 */
@Data
public class JSR303Dto {
    public interface Update{};
    public interface Add{}


    @NotNull(message = "id不能为空",groups = Update.class)
    @Null(groups = Add.class)
    private Integer id;

    //@Size 为空或者null的时候不进行校验，再加上@NotBlank表示不能为空或者是null，则@Size就一定会进行校验
    @NotBlank(groups = Add.class)
    @Size(min = 2,max = 8,message = "姓名必须是2-8位长度",groups = Update.class)
    private String name;

    @NotNull(groups = Add.class)
    @Range(min=18,max=150,message = "年龄必须在18-150岁之间",groups = Update.class)
    private Integer age;

    @NotNull(groups = Add.class)
    @Range(min = 0,max = 1,message = "性别只能是0：女，或者1：男",groups = Update.class)
    private Integer sex;

    @NotBlank(groups = Add.class)
    @Pattern(regexp = "^((17[0-9])|(14[0-9])|(13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$",message = "手机号码不合法",groups = Update.class)
    private String phone;

    @NotBlank(groups = Add.class)
    @Email(message = "邮箱不合法", groups = Update.class)
    private String email;

    @NotBlank(groups = Add.class)
   // @Pattern(regexp= "",message="出生日期格式不正确,格式应为：yyyy-MM-dd 格式",groups = Update.class)
    //自定义校验日期格式
    @ValidDate(pattern = ValidDate.PatternEnum.yyyy_MM_dd_HH_mm_ss, groups = {Update.class,Add.class}, message = "日期格式不正确，格式：yyyy-MM-dd HH:mm:ss")
    private String birthday;

   /* @AssertFalse(message = "只接收true或者false",groups = Add.class)
    @AssertTrue(message = "只接收true或者false",groups = Add.class)
   private Boolean enable;*/

   /*1、当需要布尔值的时候最好使用0跟1代替false和true，
    2、如果是数值的0和1则前端传递过来的值必须是数字类型而不能是字符串类型的"0"跟"1"
    3、可以使用Stirng去接收Integer类型的数字，能直接保存到数据库。
    这里采用数字接收
     */
    @NotNull(groups = Add.class)
    @Range(min=0,max=1,message = "只能接收1或者0",groups = Update.class)
    private Integer enable;


/*
@AssertFalse	Boolean,boolean	验证注解的元素值是false
@AssertTrue	Boolean,boolean	验证注解的元素值是true
@NotNull	任意类型	验证注解的元素值不是null
@Null	任意类型	验证注解的元素值是null
@MIN(value=值)	BigDecimal，BigInteger, byte,short, int, long，等任何Number或CharSequence（存储的是数字）子类型	验证注解的元素值大于等于@Min指定的value值
@MAX(value=值)	和@Min要求一样	验证注解的元素值小于等于@Max指定的value值
@DecimalMin(value=值)	和@Min要求一样	验证注解的元素值大于等于@ DecimalMin指定的value值
@DecimalMax(value=值)	和@Min要求一样	验证注解的元素值小于等于@ DecimalMax指定的value值
@Digits(integer=整数位数, fraction=小数位数)	和@Min要求一样	验证注解的元素值的整数位数和小数位数上限
@Size(min=下限, max=上限)	字符串、Collection、Map、数组等	验证注解的元素值的在min和max（包含）指定区间之内，如字符长度、集合大小
@Past	java.util.Date,java.util.Calendar;Joda Time类库的日期类型	验证注解的元素值（日期类型）比当前时间早
@Future	与@Past要求一样	验证注解的元素值（日期类型）比当前时间晚
@NotBlank	CharSequence子类型	验证注解的元素值不为空（不为null、去除首位空格后长度为0），不同于@NotEmpty，@NotBlank只应用于字符串且在比较时会去除字符串的首位空格
@Length(min=下限, max=上限)	CharSequence子类型	验证注解的元素值长度在min和max区间内
@NotEmpty	CharSequence子类型、Collection、Map、数组	验证注解的元素值不为null且不为空（字符串长度不为0、集合大小不为0）
@Range(min=最小值, max=最大值)	BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型	验证注解的元素值在最小值和最大值之间
@Email(regexp=正则表达式,flag=标志的模式)	CharSequence子类型（如String）	验证注解的元素值是Email，也可以通过regexp和flag指定自定义的email格式
@Pattern(regexp=正则表达式,flag=标志的模式)	String，任何CharSequence的子类型	验证注解的元素值与指定的正则表达式匹配
---------------------
作者：catoop
来源：CSDN
原文：https://blog.csdn.net/catoop/article/details/51278675
版权声明：本文为博主原创文章，转载请附上博文链接！

*/
}
